/**
 * Axios 请求封装
 * 统一处理 HTTP 请求、响应拦截、错误处理、Token 认证
 */

import axios from 'axios'
import { ElMessage } from 'element-plus'
import router from '../router'

/**
 * 创建 Axios 实例
 * baseURL: 所有请求的基础路径，会被 Vite 代理到后端
 * timeout: 请求超时时间（30秒）
 */
//这段代码是基于 axios 创建了一个自定义的请求实例 request，用于统一管理项目中的 HTTP 请求配置（如基础路径、超时时间等）,注意这里没有data
const request = axios.create({
  baseURL: '/api',  // 基础路径，实际请求：/api/xxx
  timeout: 30000    // 30秒超时
})


/**
 * 请求拦截器
 * 在发送请求之前做些什么
 * 主要用于添加认证 Token
 */
request.interceptors.request.use(
  config => {
    // 从 localStorage 获取登录时保存的 JWT Token
    const token = localStorage.getItem('token')
    
    if (token) {
      // 将 Token 添加到请求头
      // 后端通过读取 'token' 请求头来验证用户身份
      config.headers['token'] = token
    }
    
    return config
  },
  error => {
    // 请求配置出错时的处理
    console.error('请求错误:', error)
    return Promise.reject(error)
  }
)

/**
 * 响应拦截器
 * 对响应数据做点什么
 * 统一处理各种 HTTP 状态码的错误
 */
request.interceptors.response.use(
  // 响应成功的处理（状态码 2xx）
  response => {
    // 只返回响应数据部分，简化调用
    return response.data
  },
  
  // 响应失败的处理（状态码非 2xx）
  error => {
    console.error('响应错误:', error)
    
    // 服务器有响应（但状态码非 2xx）
    if (error.response) {
      const { status, data } = error.response
      
      // 根据不同的 HTTP 状态码进行处理
      switch (status) {
        case 400:
          // 请求参数错误（如格式不正确、缺少必填参数等）
          ElMessage.error(data?.message || '请求参数错误')
          break
          
        case 401:
          // 未授权（Token 过期或无效）
          ElMessage.error('未授权,请重新登录')
          // 清除本地存储的用户信息
          localStorage.removeItem('token')
          localStorage.removeItem('userInfo')
          // 跳转到登录页
          router.push('/login')
          break
          
        case 403:
          // 禁止访问（有权限但无访问该资源的权限）
          ElMessage.error('拒绝访问')
          break
          
        case 404:
          // 资源不存在
          ElMessage.error('请求的资源不存在')
          break
          
        case 500:
          // 服务器内部错误
          ElMessage.error(data?.message || '服务器内部错误')
          break
          
        default:
          // 其他错误
          ElMessage.error(data?.message || '请求失败')
      }
    } 
    // 请求发出但没有收到响应（网络问题）
    else if (error.request) {
      ElMessage.error('网络错误，请检查网络连接')
    } 
    // 请求配置出错
    else {
      ElMessage.error('请求配置错误')
    }
    
    // 返回拒绝的 Promise，让调用方可以在 catch 中处理
    return Promise.reject(error)
  }
)

// 导出封装好的请求实例
export default request
